﻿using System.Linq;
using System.Collections.Generic;

namespace Watson.Msrc
{
    internal static class CVE_2019_1064
    {
        private const string name = "CVE-2019-1064";

        public static void Check(VulnerabilityCollection vulnerabilities, int buildNumber, List<int> installedKBs)
        {
            var supersedence = new List<int>();

            switch (buildNumber)
            {
                case 14393:

                    supersedence.AddRange(new int[] {
                        4503267, 4503294, 4509475, 4507459, 4507460,
                        4512495, 4512517, 4516044, 4516061, 4522010,
                        4519998, 4524152, 4525236, 4530689
                    });

                    break;

                case 15063:

                    supersedence.AddRange(new int[] {
                        4503279, 4503289, 4509476, 4507450, 4507467,
                        4512474, 4512507, 4516059, 4516068, 4522011,
                        4520010, 4524151, 4525245, 4530711, 4534296,
                        4537765, 4540705, 4550939, 4556804, 4561605,
                        4567516, 4565499, 4571689, 4577021
                    });

                    break;

                case 16299:

                    supersedence.AddRange(new int[] {
                        4503284, 4503281, 4509477, 4507455, 4507465,
                        4512494, 4512516, 4516066, 4522012, 4520004,
                        4520006, 4524150, 4525241, 4530714, 4534276,
                        4534318, 4537789, 4537816, 4540681, 4541330,
                        4554342, 4550927, 4556812, 4561602, 4567515,
                        4565508, 4571741, 4577041
                    });

                    break;

                case 17134:

                    supersedence.AddRange(new int[] {
                        4503286, 4503288, 4509478, 4507435, 4507466,
                        4512501, 4512509, 4516045, 4516058, 4522014,
                        4519978, 4520008, 4524149, 4525237, 4530717,
                        4534293, 4534308, 4537762, 4537795, 4540689,
                        4541333, 4554349, 4550922, 4550944, 4556807,
                        4561621, 4567514, 4565489, 4571709, 4577032
                    });

                    break;

                case 17763:

                    supersedence.AddRange(new int[] {
                        4503327, 4501371, 4509479, 4505658, 4507469,
                        4511553, 4512534, 4512578, 4522015, 4519338,
                        4520062, 4524148, 4523205, 4530715, 4534273,
                        4534321, 4532691, 4537818, 4538461, 4541331,
                        4554354, 4549949, 4550969, 4551853, 4561608,
                        4567513, 4558998, 4559003, 4565349, 4571748,
                        4570333, 4577069
                    });

                    break;

                case 18362:

                    supersedence.AddRange(new int[] {
                        4503293, 4501375, 4505903, 4507453, 4512508,
                        4512941, 4515384, 4517211, 4522016, 4517389,
                        4522355, 4524147, 4524570, 4530684, 4528760,
                        4532695, 4532693, 4535996, 4540673, 4541335,
                        4551762, 4554364, 4549951, 4550945, 4556799,
                        4560960, 4567512, 4565483, 4559004, 4565351,
                        4566116, 4574727, 4577062
                    });

                    break;

                default:
                    return;
            }

            if (supersedence.Intersect(installedKBs).Any())
            {
                vulnerabilities.SetAsVulnerable(name);
            }
        }
    }
}